import Layers from "@/lang/layers";
import axios from 'axios'
import application from './application-context'

// 对 axios 进行二次封装，对全局的后台请求有个总控，今后如果有替换 axios 的想法，修改这个类即可

// 超时时间
axios.defaults.timeout = 100000;
// 跨域请求，允许保存cookie
axios.defaults.withCredentials = true;
// 基础路径
axios.defaults.baseURL = application.contextPath();

/**
 * 请求拦截
 */
axios.interceptors.request.use(config => {
    //开启加载条
    if (config.loading === true) {
        Layers.startLoading();
    }
    return config;
}, error => {
    return Promise.reject(error)
});

/**
 * 响应拦截
 */
axios.interceptors.response.use(response => {
    let config = response.config;
    //关闭加载条
    if (config.loading === true) {
        Layers.closeLoading();
    }

    if (config.responseType === undefined) {
        let contentType = response.headers['content-type'];
        // 后台响应 json 类型的数据
        if ('application/json;charset=UTF-8' === contentType || 'application/json') {
            let ret = response.data;
            if (Object.prototype.isPrototypeOf(ret)) {
                // 操作结果码为 0 或者 200，认为是操作失败，直接给出弹窗提示
                if (ret.code === 0 || ret.code === 200) {
                    return ret;
                } else {
                    Layers.warn(ret.data);
                }
            }
            return ret
        }
    } else if (config.responseType === 'text') {
        // 后台响应是一个字符串
        return response.data;
    }
    // 其它类型的响应数据
    return response;
}, error => {
    // 无响应
    if (error.response === undefined) {
        Layers.warn('服务端无响应！');
        return Promise.reject(error);
    }

    let response = error.response;
    // 关闭加载条
    let config = response.config;
    if (config.loading === true) {
        Layers.closeLoading();
    }

    if (response.status === 401) {
    } else if (response.status === 402 || response.status === 403) {
        // 402 未登录或者refresh token过时， 403 账号在其他地方登录
        Layers.warn(response.data || reponse.data.exception);
        application.logout();
    } else if (response.status === 404) {
        // 路径找不到
        Layers.warn('404，资源未找到:' + response.data.path);
    } else if (response.status === 504) {
        // 网关超时
        Layers.warn('网络连接错误:' + response.data);
    } else {
        // 其它错误
        Layers.warn(response.data || response || error);
    }
    return Promise.reject(error);
});
export default axios;
